<!DOCTYPE html>
<html><head>
	<meta charset="UTF-8" />
	<meta name"generator" content="ldoc - 0.1.0" />
	<meta name"viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
	<title>ldoc 的语法</title>
	<style>

/* 基础重置与字体设置 */
body {
    font-family: -apple-system, BlinkMacSystemFont, "Fira Sans", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    line-height: 1.6;
    color: #333;
    max-width: 800px;
    margin: 0 auto;
    padding: 2rem;
    background-color: #f8f9fa;
}

/* 标题样式 */
h1 {
    font-size: 2.5rem;
    font-weight: 700;
    color: #2c3e50;
    margin: 2.5rem 0 1.5rem;
    padding-bottom: 0.5rem;
    border-bottom: 2px solid #e3e8ee;
}

h2 {
    font-size: 1.8rem;
    font-weight: 600;
    color: #34495e;
    margin: 2rem 0 1rem;
}

/* 段落样式 */
p {
    font-size: 1.1rem;
    margin-bottom: 1.2rem;
    text-align: justify;
}

/* 链接样式 */
a {
    color: #3498db;
    text-decoration: none;
    transition: color 0.2s ease;
}

a:hover {
    color: #2980b9;
    text-decoration: underline;
}

pre {
    background-color: #f8f9fa;
    border-left: 4px solid #3498db;
    padding: 1.2rem;
    margin: 1.5rem 0;
    overflow-x: auto;
    border-radius: 0 4px 4px 0;
    font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
    font-size: 0.95rem;
    line-height: 1.5;
    white-space: pre-wrap;
    word-wrap: break-word;
}

/* 代码样式 */
code {
    font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
    font-size: 0.9rem;
    background-color: #f1f3f4;
    padding: 0.2rem 0.4rem;
    border-radius: 4px;
    color: #d63384;
}

pre code {
    background-color: transparent;
    padding: 0;
    color: inherit;
    font-size: inherit;
}

/* 引用块样式 */
blockquote {
    background-color: #f8f9fa;
    border-left: 4px solid #6c757d;
    padding: 1rem 1.5rem;
    margin: 1.5rem 0;
    font-style: italic;
    color: #6c757d;
    border-radius: 0 4px 4px 0;
}

blockquote p:last-child {
    margin-bottom: 0;
}

/* 列表样式 */
ul, ol {
    margin: 1.2rem 0;
    padding-left: 2rem;
}

li {
    margin-bottom: 0.5rem;
    line-height: 1.6;
}

/* 图像样式 */
img {
    max-width: 100%;
    height: auto;
    border-radius: 4px;
    margin: 1.5rem 0;
}

/* 表格样式 */
table {
    width: 100%;
    border-collapse: collapse;
    margin: 1.5rem 0;
    background-color: #fff;
    box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}

th, td {
    padding: 0.75rem;
    text-align: left;
    border-bottom: 1px solid #e3e8ee;
}

th {
    background-color: #f8f9fa;
    font-weight: 600;
    color: #2c3e50;
}

tr:hover {
    background-color: #f8f9fa;
}

/* 响应式设计 */
@media (max-width: 768px) {
    pre {
        padding: 1rem;
        font-size: 0.85rem;
    }
    
    blockquote {
        padding: 0.8rem 1rem;
    }
    
    ul, ol {
        padding-left: 1.5rem;
    }
    
    table {
        display: block;
        overflow-x: auto;
    }
}


	</style>
</head><body><div id="content">
<h1 id="header-toc">目录<a href="#toc-header-toc"> ¶</a> </h1>
<ul>
<li><p><a href="#header-a39a87f8d62ed890" id="toc-header-a39a87f8d62ed890">ldoc 的语法</a></p>
<ol>
<li><a href="#header-c999c0c687d981c6" id="toc-header-c999c0c687d981c6">简介</a></li>
<li><a href="#header-11c167898c29b2fe" id="toc-header-11c167898c29b2fe">块（block）和段（span）。</a></li>
<li><a href="#header-51be53ec921eb8b2" id="toc-header-51be53ec921eb8b2">HTML</a></li>
<li><a href="#header-1c70ffbd19f02bee" id="toc-header-1c70ffbd19f02bee">命令索引</a></li>
<li><a href="#header-7795da5e663b71c8" id="toc-header-7795da5e663b71c8">TODO</a></li>
</ol>
</li>
</ul>
<h1 id="header-a39a87f8d62ed890">ldoc 的语法<a href="#toc-header-a39a87f8d62ed890"> ¶</a> </h1>
<h2 id="header-c999c0c687d981c6">简介<a href="#toc-header-c999c0c687d981c6"> ¶</a> </h2>
<p>ldoc 是基于行的文档格式，大部分情况下，每行会被解释为一条命令。根据命令的不同，可能接受不同数量的参数，这些参数都是以空格分开的单词，但最后一个参数例外，最后一个参数可以包含空格。</p>
<p>例如甲命令接受一个参数，那么命令「甲 a b c」会把「a b c」看作第1个参数。又例如乙命令接受两个参数，那么命令「乙 a b c」会把「a」看作第1个参数。把「b c」看作为第2个参数。</p>
<p>命令前可以加上若干个制表符缩进，它可以让文档更可读，但是没有语法含义。注意不要用空格缩进，多数情况下，ldoc发现行首有空格时会报告错误。</p>
<p>空行也没有语法含义，跟缩进一样，适当空行可以让文档更可读。下面展示了一个有标题和段落的短文章：</p>
<pre>Header 1 这是1级标题

P 这是一段话。
\ 这是上一段的一部分。

Header 2 这是2级标题

P 这是一段话。
P 这是另一段话。
</pre>
<p>渲染之后是这样：</p>
<blockquote>
<h1 id="">这是1级标题<a href="#toc-"> ¶</a> </h1>
<p>这是一段话。这是上一段的一部分。</p>
<h2 id="">这是2级标题<a href="#toc-"> ¶</a> </h2>
<p>这是一段话。</p>
<p>这是另一段话。</p>
</blockquote>
<p>「P &lt;content&gt;」命令<b>开始</b>插入一个段落，&lt;content&gt; 是段落中的文字。使用继续命令「\ &lt;content&gt;」继续插入文字到段落中。也就是说，使用一个P命令后面跟着若干个继续命令可以插入一个段落。例如：</p>
<pre>P 这是第一句话。
\ 这是第二句话。
\ 这是第三句话。

P 这是第二段。
</pre>
<p>会渲染成：</p>
<blockquote>
<p>这是第一句话。这是第二句话。这是第三句话。</p>
<p>这是第二段。</p>
</blockquote>
<p>因为缩进和断行的位置并不影响插入的文字，所以下面的写法渲染结果也是一样的：</p>
<pre>P 这是第一句话。这是第二句话。
	\ 这是第三句话。

P 这是第二段。
</pre>
<p>标题命令「Header N &lt;header&gt;」是第二个常见命令，它插入一个标题。N 是标题的等级，从1开始，1级标题是最大的标题，&lt;header&gt; 是标题的内容。Header 命令后面也可以跟着继续命令，表示继续插入标题的内容。例如：</p>
<pre>Header 1 这是标题；
\ 这也是标题。
</pre>
<p>将会插入一级标题，标题的内容是「这是标题；这也是标题」。</p>
<h2 id="header-11c167898c29b2fe">块（block）和段（span）。<a href="#toc-header-11c167898c29b2fe"> ¶</a> </h2>
<p>ldoc的命令产生的对象分为块和段两种，一般来说块是有独立意义的内容。标题（Header）、段落（P）、逐字块（Verbatim）、列表（Ol 和 Ul）都产生块。</p>
<p>块是由多个段组成的，段一般不具有独立的意义。继续命令（\）、粗体命令（B）、斜体命令（I）、行内代码（C）命令都产生段。命令产生的段会<b>加入</b>上一个块。</p>
<h2 id="header-51be53ec921eb8b2">HTML<a href="#toc-header-51be53ec921eb8b2"> ¶</a> </h2>
<p>大部分标签都有直接对应的 HTML 标签。这里暂时不列出具体的转换关系。特别是生成的 HTML 会产生目录（TOC, Table of content），标题会自动产生名叫header-HASH 的 HTML ID。</p>
<h2 id="header-1c70ffbd19f02bee">命令索引<a href="#toc-header-1c70ffbd19f02bee"> ¶</a> </h2>
<ul>
<li><p><code>P X：</code>插入段落，X是段落的内容。</p>
<pre>P 这是一个段落。
</pre>
<blockquote>
<p>这是一个段落。</p>
</blockquote>
</li>
<li><p><code>Verbatim ... End：</code>逐字段落。</p>
<pre>Verbatim
	print("Hello")
End
</pre>
<blockquote>
<pre>print("Hello")
</pre>
</blockquote>
</li>
<li><p><code>Quote .. End：</code>引用段落。</p>
<pre>Quote
	P 被引用的段落。
End
</pre>
<blockquote>
<blockquote>
<p>被引用的段落。</p>
</blockquote>
</blockquote>
</li>
<li><p><code>Header N X</code>：插入N级标题X。</p>
<pre>Header 3 示例标题
</pre>
<blockquote>
<h3 id="">示例标题<a href="#toc-"> ¶</a> </h3>
</blockquote>
</li>
<li><p><code>Ol .. Li .. Li .. End</code>：有序列表。</p>
<pre>Ol 示例列表项目。
Li 示例列表项目。
End
</pre>
<blockquote>
<ol>
<li>示例列表项目。</li>
<li>示例列表项目。</li>
</ol>
</blockquote>
</li>
<li><p><code>Ul .. Li .. Li .. End</code>：无序列表。</p>
<pre>Ul 示例列表项目。
Li 示例列表项目。
End
</pre>
<blockquote>
<ul>
<li>示例列表项目。</li>
<li>示例列表项目。</li>
</ul>
</blockquote>
</li>
<li><p><code>B X</code>：插入粗体的文字 X。</p>
<pre>P 展示
B 粗体
</pre>
<blockquote>
<p>展示<b>粗体</b></p>
</blockquote>
</li>
<li><p><code>I X</code>：插入斜体的文字 X。</p>
<pre>P 展示
I 斜体
</pre>
<blockquote>
<p>展示<i>斜体</i></p>
</blockquote>
</li>
<li><p><code>C X</code>：插入行内代码文字 X。</p>
<pre>P 展示
C 行内代码
</pre>
<blockquote>
<p>展示<code>行内代码</code></p>
</blockquote>
</li>
<li><p><code>Link HREF</code>：插入链接 HREF。</p>
<pre>P 展示链接：
Link https://gitcode.com/lovejia2022/ldoc
</pre>
<blockquote>
<p>展示链接：<a href="https://gitcode.com/lovejia2022/ldoc">https://gitcode.com/lovejia2022/ldoc</a></p>
</blockquote>
</li>
<li><p><code>Image BLOB:PATH</code>：插入图像。</p>
<p>BLOB 是某个通过 Meta BlobXXX 定义的文件夹的名字。PATH 是相对于此文件夹的相对路径。</p>
<p>例如命令：Meta BlobPictures /home/user/Pictures 将 /home/user/Pictures这个路径记录为名叫 "Pictures" 的 Blob 文件夹。接下来定义的 Image 命令中如果出现 Pictures: 开头的图片路径，会在执行命令时被 ldoc 翻译为 /home/user/Pictures 开头的路径。</p>
<pre>Image Pictures:path/to/file.png
</pre>
</li>
<li><p><code>\ X</code>：继续命令、插入普通样式的文字 X。</p>
<pre>P 展示
\ 继续命令。
</pre>
<blockquote>
<p>展示继续命令。</p>
</blockquote>
</li>
<li><p><code>Nl</code>：插入新行。</p>
<pre>P 第一行
Nl
\ 第二行
</pre>
<blockquote>
<p>第一行<br/>第二行</p>
</blockquote>
</li>
<li><p><code>Space N</code>：插入 N 个空格。</p>
<pre>P 间隔一个空格(
Space
\ )

P 间隔两个空格(
Space 2
\ )

P 间隔三个空格(
Space 3
\ )
</pre>
<blockquote>
<p>间隔一个空格( )</p>
<p>间隔两个空格( &nbsp;)</p>
<p>间隔三个空格( &nbsp; )</p>
</blockquote>
</li>
<li><p><code>Include PATH</code>：引入 PATH 指向的文件包含的块。PATH 是相对于当前文件所在目录的相对目录。</p>
<pre>Include path/to/file.ldoc
</pre>
</li>
</ul>
<h2 id="header-7795da5e663b71c8">TODO<a href="#toc-header-7795da5e663b71c8"> ¶</a> </h2>
<ul>
<li><p>更多命令和语言特性：</p>
<ul>
<li>更好的空格控制。</li>
<li>锚和索引。</li>
<li>检查清单支持。</li>
<li>外部图像。</li>
<li>内联图像。</li>
<li>Include 增加对压缩文件的支持。</li>
<li>表格。</li>
</ul>
</li>
<li><p>优化转换输出：</p>
<ul>
<li>用 <a href="https://docs.rs/html/latest/html/index.html">https://docs.rs/html/latest/html/index.html</a> 替代手动生成的 HTML。</li>
<li>转换为 markdown（common-mark）。<a href="https://spec.commonmark.org/0.31.2/spec.json">https://spec.commonmark.org/0.31.2/spec.json</a></li>
<li>生成 PDF。</li>
</ul>
</li>
<li><p>工具支持：</p>
<ul>
<li>编辑器支持。</li>
</ul>
</li>
</ul>
</div></body></html>
